package com.saa.user.service;


import com.saa.application.service.ApplicationInfoService;
import com.saa.common.redis.service.RedisService;
import com.saa.common.utils.CommonUtil;
import com.saa.common.utils.HttpRequestUtil;
import com.saa.common.vo.OmsResultVo;
import com.saa.dept.service.SaaDeptService;
import com.saa.dept.vo.SaaDeptVo;
import com.saa.dict.po.SaaDict;
import com.saa.dict.service.SaaDictService;
import com.saa.dict.vo.SaaDictVo;
import com.saa.role.po.SaaRoleDept;
import com.saa.role.service.SaaRoleService;
import com.saa.role.vo.SaaRoleVo;
import com.saa.user.dao.*;
import com.saa.user.po.*;
import com.saa.user.vo.SaaStaffVo;
import com.saa.user.vo.SaaUserRiskVo;
import ins.framework.utils.Beans;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.*;

@Service
public class SaaUserService {
    @Autowired
    private SaaStaffDao saaStaffDao;
    @Autowired
    private SaaUserInfoDao saaUserInfoDao;
    @Autowired
    private SaaUserDeptDao saaUserDeptDao;
    @Autowired
    private SaaDeptService saaDeptService;
    @Autowired
    private SaaUserRiskDao saaUserRiskDao;
    @Autowired
    private SaaUserDictDao saaUserDictDao;
    @Autowired
    private SaaDictService saaDictService;
    @Autowired
    private SaaUserRoleDao saaUserRoleDao;
    @Autowired
    private SaaRoleService saaRoleService;
    @Autowired
    private ApplicationInfoService applicationinfoService;

    /****根据机构、员工姓名、岗位、状态、入职时间分页查询权限列表***/
    public OmsResultVo getUserListPage(SaaStaffVo saaStaffVo){
        List<SaaStaffVo> saaStaffVos =new ArrayList<SaaStaffVo>();
        String deptCode = saaStaffVo.getComCode();
        String criteria = saaStaffVo.getCriteria();

        int page = saaStaffVo.getPage();
        int pageSize = saaStaffVo.getPageSize();
        int startIndex = (page - 1) * pageSize;
        Map<String, Object> params = new HashMap<>();
        params.put("startIndex",startIndex);
        params.put("pageSize",pageSize);
        params.put("deptCode",deptCode);
        params.put("criteria",criteria);
        List<SaaStaff> saaStaffList =  saaStaffDao.selectUserPage(params);
        Integer count = saaStaffDao.selectUserCount(params);
        for(SaaStaff saaStaff :saaStaffList){
            SaaStaffVo staffVo = new SaaStaffVo();
            Beans.copy().from(saaStaff).to(staffVo);
            saaStaffVos.add(staffVo);
        }
        return OmsResultVo.builderPage(200, "查询成功", count,saaStaffVos);
    }

    /****根据人员ID获取人员详情***/
    public OmsResultVo getUserInfo(SaaStaffVo saaStaffVo){
        String userCode = saaStaffVo.getUserCode();
        SaaStaff saaStaff = saaStaffDao.selectByPrimaryKey(userCode);
        SaaStaffVo staffVo = new SaaStaffVo();
        if(saaStaff!=null){
            Beans.copy().from(saaStaff).to(staffVo);
        }else{
            return OmsResultVo.builder(500, "用户不存在，请联系管理员", null);
        }
        Map<String, Object> params = new HashMap<>();
        params.put("userCode",saaStaff.getUserCode());
        SaaUserInfo saaUserInfo = saaUserInfoDao.selectUserInfo(params);
        if(saaUserInfo!=null){
            staffVo.setProfilePicture(saaUserInfo.getProfilePicture());
        }
        return OmsResultVo.builder(200, "查询成功", staffVo);
    }

    /****根据人员ID获取数据权限***/
    public SaaStaffVo getUserDict(SaaStaffVo saaStaffVo){
        String userCode = saaStaffVo.getUserCode();
        SaaStaff saaStaff = saaStaffDao.selectByPrimaryKey(userCode);
        SaaStaffVo staffVo = new SaaStaffVo();
        if(saaStaff!=null){
            Beans.copy().from(saaStaff).to(staffVo);
        }else{
            return null;
        }
        Map<String, Object> params = new HashMap<>();
        params.put("userCode",saaStaff.getUserCode());
        SaaUserInfo saaUserInfo = saaUserInfoDao.selectUserInfo(params);
        if(saaUserInfo!=null){
            staffVo.setProfilePicture(saaUserInfo.getProfilePicture());
        }
        /****获取允许机构***/
        List<SaaUserDept> saaUserDepts = saaUserDeptDao.selectUserDeptByUserCode(params);
        SaaDeptVo saaDeptVo= saaDeptService.getSaaDeptList(saaUserDepts);
        //允许机构
        staffVo.setSaaDeptVo(saaDeptVo);
        /****允许产品***/
        params.put("userId",saaStaff.getUserCode());
        List<SaaUserRisk> saaUserRisks = saaUserRiskDao.selectUserRiskByUserCode(params);
        List<SaaUserRiskVo> saaUserRisksVo = new ArrayList<SaaUserRiskVo>();
        for(SaaUserRisk saaUserRisk:saaUserRisks){
            SaaUserRiskVo userRiskVo = new SaaUserRiskVo();
            Beans.copy().from(saaUserRisk).to(userRiskVo);
            saaUserRisksVo.add(userRiskVo);
        }
        staffVo.setSaaUserRiskVo(saaUserRisksVo);
        /****数据权限***/
        List<SaaUserDict> saaUserDicts = saaUserDictDao.selectUserDistByUserCode(params);
        Map<String,List<SaaDictVo>> map = new HashMap<String,List<SaaDictVo>>();
        for(SaaUserDict saaUserDict:saaUserDicts){
            if(map.get(saaUserDict.getDictId())==null){
                List<SaaDictVo> vo = new ArrayList<SaaDictVo>();
                SaaDictVo saaDictVo = saaDictService.getSaaDictVo(saaUserDict.getDictId());
                vo.add(saaDictVo);
                map.put(saaUserDict.getDictId(),vo);
            }else{
                List<SaaDictVo> vo = map.get(saaUserDict.getDictId());
                SaaDictVo saaDictVo = saaDictService.getSaaDictVo(saaUserDict.getDictId());
                vo.add(saaDictVo);
                map.put(saaUserDict.getDictId(),vo);
            }
        }
        staffVo.setDictVoMap(map);
        return staffVo;
    }

    /****根据人员ID获取人员角色列表***/
    public SaaStaffVo getUserRole(SaaStaffVo saaStaffVo){
        SaaStaffVo staffVo = new SaaStaffVo();
        List<SaaRoleVo> saaRoleVos = new ArrayList<SaaRoleVo>();
        String userCode = saaStaffVo.getUserCode();
        Map<String, Object> params = new HashMap<>();
        params.put("userCode",userCode);
        List<SaaUserRole> saaUserRoles = saaUserRoleDao.selectUserRoleByUserCode(params);
        for(SaaUserRole saaUserRole:saaUserRoles){
            SaaRoleVo saaRoleVo = saaRoleService.getSaaRoleVo(saaUserRole.getRoleId());
            saaRoleVo.setApplicationName(applicationinfoService.getSaaApplicationInfo(saaRoleVo.getApplicationId()));
            saaRoleVos.add(saaRoleVo);
        }
        staffVo.setSaaRoleVos(saaRoleVos);
        return staffVo;
    }

    /****数据权限授权***/
    @Transactional
    public OmsResultVo saveUserInformation(SaaStaffVo saaStaffVo){
        String userCode = saaStaffVo.getUserCode();
        List<SaaUserRiskVo> saaUserRiskVos = saaStaffVo.getSaaUserRiskVo();
        List<SaaDictVo> saaDictVos = saaStaffVo.getSaaDictVos();
        SaaStaff saaStaff = saaStaffDao.selectByPrimaryKey(userCode);
        if(saaStaff==null){
            return OmsResultVo.builder(500, "用户不存在，请联系管理员", null);
        }
        //查询险种授权，然后删除所有授权再插入
        Map<String, Object> params = new HashMap<>();
        params.put("userCode",saaStaff.getUserCode());
        List<SaaUserRisk> saaUserRisks = saaUserRiskDao.selectUserRiskByUserCode(params);
        if(saaUserRisks.size()>0){
            for(SaaUserRisk saaUserRisk:saaUserRisks){
                saaUserRiskDao.deleteByPrimaryKey(saaUserRisk.getId());
            }
        }
        for(SaaUserRiskVo saaUserRiskVo:saaUserRiskVos){
            SaaUserRisk saaUserRisk = new SaaUserRisk();
            saaUserRisk.setId(CommonUtil.getUpperUuid());
            saaUserRisk.setUserId(userCode);
            saaUserRisk.setRiskId(saaUserRiskVo.getRiskId());//存的是险种代码
            saaUserRisk.setCreateBy(HttpRequestUtil.getUserCode());
            saaUserRisk.setUpdateBy(HttpRequestUtil.getUserCode());
            saaUserRisk.setCreateTime(new Date());
            saaUserRisk.setUpdateTime(new Date());
            saaUserRisk.setValid("1");
            saaUserRiskDao.insertSelective(saaUserRisk);
        }
        List<SaaUserDict> saaUserDicts = saaUserDictDao.selectUserDistByUserCode(params);
        if(saaUserDicts.size()>0){
            for(SaaUserDict saaUserDict:saaUserDicts){
                saaUserDictDao.deleteByPrimaryKey(saaUserDict.getId());
            }
        }
        for(SaaDictVo saaDictVo:saaDictVos){
            SaaUserDict saaUserDict = new SaaUserDict();
            saaUserDict.setId(CommonUtil.getUpperUuid());
            saaUserDict.setUserCode(userCode);
            saaUserDict.setDictId(saaDictVo.getDictId());
            saaUserDict.setCreateBy(HttpRequestUtil.getUserCode());
            saaUserDict.setUpdateBy(HttpRequestUtil.getUserCode());
            saaUserDict.setCreateTime(new Date());
            saaUserDict.setUpdateTime(new Date());
            saaUserDict.setValid("1");
            saaUserDictDao.insertSelective(saaUserDict);
        }
        return OmsResultVo.builder(200, "授权成功", saaStaffVo);
    }

    /****角色授权***/
    @Transactional
    public OmsResultVo saveUserRole(SaaStaffVo saaStaffVo){
        String userCode = saaStaffVo.getUserCode();
        SaaStaff saaStaff = saaStaffDao.selectByPrimaryKey(userCode);
        if(saaStaff==null){
            return OmsResultVo.builder(500, "用户不存在，请联系管理员", null);
        }
        List<SaaRoleVo> saaRoleVos = saaStaffVo.getSaaRoleVos();
        Map<String, Object> params = new HashMap<>();
        params.put("userCode",userCode);
        List<SaaUserRole> saaUserRoles = saaUserRoleDao.selectUserRoleByUserCode(params);
        if(saaUserRoles.size()>0){
            for(SaaUserRole saaUserRole:saaUserRoles){
                saaUserRoleDao.deleteByPrimaryKey(saaUserRole.getId());
            }
        }
        //删除机构授权
        List<SaaUserDept> saaUserDepts = saaUserDeptDao.selectUserDeptByUserCode(params);
        if(saaUserDepts.size()>0){
            for(SaaUserDept saaUserDept:saaUserDepts){
                saaUserDeptDao.deleteByPrimaryKey(saaUserDept.getId());
            }
        }

        //角色授权
        for(SaaRoleVo saaRoleVo:saaRoleVos){
            //查询角色下的机构
            List<SaaRoleDept> saaRoleDepts = saaRoleService.getSaaRoleByDept(saaRoleVo.getId());
            for(SaaRoleDept saaRoleDept:saaRoleDepts){
                SaaUserDept saaUserDept = new SaaUserDept();
                saaUserDept.setId(CommonUtil.getUpperUuid());
                saaUserDept.setUserId(userCode);
                saaUserDept.setDeptId(saaRoleDept.getDeptId());
                saaUserDept.setCreateBy(HttpRequestUtil.getUserCode());
                saaUserDept.setUpdateBy(HttpRequestUtil.getUserCode());
                saaUserDept.setCreateTime(new Date());
                saaUserDept.setUpdateTime(new Date());
                saaUserDept.setValid("1");
                saaUserDeptDao.insertSelective(saaUserDept);
            }
            SaaUserRole saaUserRole = new SaaUserRole();
            saaUserRole.setId(CommonUtil.getUpperUuid());
            saaUserRole.setUserId(userCode);
            saaUserRole.setRoleId(saaRoleVo.getId());
            saaUserRole.setCreateBy(HttpRequestUtil.getUserCode());
            saaUserRole.setUpdateBy(HttpRequestUtil.getUserCode());
            saaUserRole.setCreateTime(new Date());
            saaUserRole.setUpdateTime(new Date());
            saaUserRole.setValid("1");
            saaUserRoleDao.insertSelective(saaUserRole);
        }
        return OmsResultVo.builder(200, "授权成功", saaStaffVo);
    }

    /****根据用户代码获取角色和权限***/
    public SaaStaffVo getUserRoleAndInformation(SaaStaffVo saaStaffVo){
        String userCode = saaStaffVo.getUserCode();
        SaaStaff saaStaff = saaStaffDao.selectByPrimaryKey(userCode);
        SaaStaffVo staffVo = new SaaStaffVo();
        if(saaStaff!=null){
            Beans.copy().from(saaStaff).to(staffVo);
        }else{
            return null;
        }
        Map<String, Object> params = new HashMap<>();
        params.put("userCode",saaStaff.getUserCode());
        SaaUserInfo saaUserInfo = saaUserInfoDao.selectUserInfo(params);
        if(saaUserInfo!=null){
            staffVo.setProfilePicture(saaUserInfo.getProfilePicture());
        }
        /****获取允许机构***/
        List<SaaUserDept> saaUserDepts = saaUserDeptDao.selectUserDeptByUserCode(params);
        SaaDeptVo saaDeptVo= saaDeptService.getSaaDeptList(saaUserDepts);
        //允许机构
        staffVo.setSaaDeptVo(saaDeptVo);
        /****允许产品***/
        params.put("userId",saaStaff.getUserCode());
        List<SaaUserRisk> saaUserRisks = saaUserRiskDao.selectUserRiskByUserCode(params);
        List<SaaUserRiskVo> saaUserRisksVo = new ArrayList<SaaUserRiskVo>();
        for(SaaUserRisk saaUserRisk:saaUserRisks){
            SaaUserRiskVo userRiskVo = new SaaUserRiskVo();
            Beans.copy().from(saaUserRisk).to(userRiskVo);
            saaUserRisksVo.add(userRiskVo);
        }
        staffVo.setSaaUserRiskVo(saaUserRisksVo);
        /****数据权限***/
        List<SaaUserDict> saaUserDicts = saaUserDictDao.selectUserDistByUserCode(params);
        Map<String,List<SaaDictVo>> map = new HashMap<String,List<SaaDictVo>>();
        for(SaaUserDict saaUserDict:saaUserDicts){
            if(map.get(saaUserDict.getDictId())==null){
                List<SaaDictVo> vo = new ArrayList<SaaDictVo>();
                SaaDictVo saaDictVo = saaDictService.getSaaDictVo(saaUserDict.getDictId());
                vo.add(saaDictVo);
                map.put(saaUserDict.getDictId(),vo);
            }else{
                List<SaaDictVo> vo = map.get(saaUserDict.getDictId());
                SaaDictVo saaDictVo = saaDictService.getSaaDictVo(saaUserDict.getDictId());
                vo.add(saaDictVo);
                map.put(saaUserDict.getDictId(),vo);
            }
        }
        staffVo.setDictVoMap(map);
        List<SaaRoleVo> saaRoleVos = new ArrayList<SaaRoleVo>();
        List<SaaUserRole> saaUserRoles = saaUserRoleDao.selectUserRoleByUserCode(params);
        for(SaaUserRole saaUserRole:saaUserRoles){
            SaaRoleVo saaRoleVo = saaRoleService.getSaaRoleVo(saaUserRole.getRoleId());
            saaRoleVo.setSaaPrivilegeVos(saaRoleService.getPrivilegeList(saaRoleVo.getId()));
            saaRoleVo.setApplicationName(applicationinfoService.getSaaApplicationInfo(saaRoleVo.getApplicationId()));
            saaRoleVos.add(saaRoleVo);
        }
        staffVo.setSaaRoleVos(saaRoleVos);
        return staffVo;
    }
}
